/* 验证模块 Author By Fengbao */

// 验证方法
import test from './validate_test.js';

/**
 * 数据验证器
 * 
 * @param {Object} data 数据
 * @param {Object} rules 验证规则
 */
function validate(data, rules) {
    let name, rule, item, number, msg;
    for (let key in rules) {
        rule = rules[key].split('|');
        key = key.split('|');
        name = key[1];
        key = key[0];
        for (let i in rule) {
            item = rule[i].split(':');
            switch (item[0]) {
                case 'email': // 邮箱
                    if (!test.email(data[key])) {
                        return { field: key, msg: name + '格式不符' };
                    }
                    break;
                case 'mobile': // 手机
                    if (!test.mobile(data[key])) {
                        return { field: key, msg: name + '格式不符' };
                    }
                    break;
                case 'url':
                    if (!test.url(data[key])) {
                        return { field: key, msg: name + '不是有效的URL地址' };
                    }
                    break;
                case 'date':
                    if (!test.date(data[key])) {
                        return { field: key, msg: name + '不是有效的日期格式' };
                    }
                    break;
                case 'dateISO':
                    if (!test.dateISO(data[key])) {
                        return { field: key, msg: name + '不是有效的日期格式' };
                    }
                    break;
                case 'number': // 包含整数，小数，负数，带千分位数
                    if (!test.number(data[key])) {
                        return { field: key, msg: name + '必须是数字' };
                    }
                    break;
                case 'integer':
                    if (!test.digits(data[key])) {
                        return { field: key, msg: name + '必须是整数' };
                    }
                    break;
                case 'idCard': // 身份证
                    if (!test.idCard(data[key])) {
                        return { field: key, msg: name + '格式不符' };
                    }
                    break;
                case 'carNo': // 车牌号
                    if (!test.carNo(data[key])) {
                        return { field: key, msg: name + '格式不符' };
                    }
                    break;
                case 'amount': // 金额，最多两位小数点
                    if (!test.amount(data[key])) {
                        return { field: key, msg: name + '格式不符' };
                    }
                    break;
                case 'chs':
                    if (!test.chinese(data[key])) {
                        return { field: key, msg: name + '只能是汉字' };
                    }
                    break;
                case 'alpha':
                    if (!test.letter(data[key])) {
                        return { field: key, msg: name + '只能是字母' };
                    }
                    break;
                case 'alphaNum':
                    if (!test.enOrNum(data[key])) {
                        return { field: key, msg: name + '只能是字母或数字' };
                    }
                    break;
                case 'contains':
                    if (!test.enOrNum(data[key], item[1])) {
                        return { field: key, msg: name + '不包含' + item[1] };
                    }
                    break;
                case 'between': // 数字区间
                    number = item[1].split(',').map(Number);
                    if (!test.range(data[key], number)) {
                        return { field: key, msg: name + '只能在 ' + number[0] + ' - ' + number[1] + ' 之间' };
                    }
                    break;
                case 'length': // 字符长度或长度范围
                    number = item[1].split(',').map(Number);
                    if (number.length == 1) {
                        number = [number, number];
                    }
                    if (!test.rangeLength(data[key], number)) {
                        if (number[0] == number[1]) {
                            return { field: key, msg: name + '长度必须是 ' + number[0] + ' 个字符' };
                        } else {
                            return { field: key, msg: name + '长度必须是 ' + number[0] + ' - ' + number[1] + ' 个字符' };
                        }
                    }
                    break;
                case 'require':
                    if (test.empty(data[key])) {
                        return { field: key, msg: name + '不能为空' };
                    }
                    break;
                case 'json':
                    if (!test.jsonString(data[key])) {
                        return { field: key, msg: name + '必须是JSON字符串' };
                    }
                    break;
                case 'tel': // 固定电话
                    if (!test.landline(data[key])) {
                        return { field: key, msg: name + '格式不符' };
                    }
                    break;
                case 'object':
                    if (!test.object(data[key])) {
                        return { field: key, msg: name + '必须是对象' };
                    }
                    break;
                case 'array':
                    if (!test.array(data[key])) {
                        return { field: key, msg: name + '必须是数组' };
                    }
                    break;
                case 'code': // 验证码长度
                    if (!test.code(data[key], item[1])) {
                        return { field: key, msg: name + '格式不符' };
                    }
                    break;
                default:
                    break;
            }
        }
    }
}

module.exports = {
    validate
}
